/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-02-20
 * Time: 22:04
 */

//求出0～n之间的所有“水仙花数”并输出。
// (“水仙花数”是指一个三位数，其各位数字的立方和确好等于该数本 身，如；153＝1^3＋5^3＋3^3，则153是一个“水仙花数“。）


/*
    思路：

            此题的关键在于只要知道判断一个数据是否为水仙花数的方式，问题就迎刃而解。假定给定一个数据data，具体检测方式如下：

            1. 求取data是几位数

            2. 获取data中每个位置上的数据，并对其进行立方求和

            3. 对data中每个位上的数据立方求和完成后，在检测其结果是否与data相等即可，

            相等：则为水仙花数

            否则：不是

            具体实现参考以下代码。*/

import java.util.Scanner; // // 导入 Scanner 类，用于从控制台读取用户输入
public class test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//从控制台读取一个整数 n，表示要查找水仙花数的范围是 0 到 n
        for (int i = 0; i <= n ; i++) {
            int count = 1;//用于记录当前数字 i 的位数，初始化为 1
            int tmp = i; // 将 i 的值赋给 tmp，用于后续计算
            int sum = 0;// 用于存储每一位数字的次方和
            //判断i是否为水仙花数
            //1. 求判断数字的位数
            while(tmp/10 != 0)//比如153/10=15，15/10=1，1/10=0，一共循环三次，循环一次count++一次
            {
                count++;
                tmp = tmp/10;// 去掉最后一位，继续检查更高位
            }
            //2. 计算每一位的次方和
            tmp = i;//把153又赋给tmp，用于计算次方和
            while(tmp != 0)
            {
                sum += Math.pow(tmp%10, count);// 计算当前位的 count 次方，并加到 sum 中
                tmp = tmp/10;// 去掉最后一位，继续计算下一位
            }
            //3. 判断
            if(sum == i)// 如果 sum 等于 i，说明 i 是水仙花数
                System.out.println(i+"是水仙花数");// 输出水仙花数
        }
    }

}
